package mybox.engine.heliostat;

public class GegenGewicht {
	
	//1.307 ist spezifisches Gewicht von Kies (in g/ccm)
	public static final double spezifischesGewicht=1.30687;
	
	public double gewicht;
	public double spiegelGewicht;
	public double materialDicke;
	
	// \/=ssy
	public double spiegelErhoehung;
	// \/ssx
	public double spiegelFrontabstand;
	
	// \/=sgx
	public double gewichtRueckversetzung;
	// \/=sgy
	public double gegenGewichtErniedrigung;
	
	public double elvBoxHoeheHalf;	
	public double distAchse2Rand;
	public double sollFreiraum;
	public double tatsFreiraum;
	
	
	
	
	
	/**\/rueckVersFaktor habe ich als gefühlsmässigen 
	 * Designparameter angenommen.
	 * Dadurch muss das Gegengewicht ungefähr 
	 * Spiegelgewicht/rueckVersFaktor haben.
	*/
	public static double rueckVersFaktor=1.0;
	
	//Das was bei der Extension noch ueber das elvCenter hinausragt
	public static double extraUeberlappung=25;
	
	public double schachtelLaenge;
	private double schachtelInnenLaenge;
	public double schachtelBreite;
	private double schachtelInnenBreite;
	public double schachtelHoehe;
	private double schachtelInnenHoehe;
	public double schachtelExtension;
	
	public double querBrettBreite;
	public double querBrettLaenge;
	
	public GegenGewicht(
			double spiegelGewicht,
			double spiegelFrontabstand,//=ssx
			double elvBoxHoeheHalf,
			double distAchse2Rand,
			double freiRaum,
			double schachtelHoehe,			
			double materialDicke
			) {
		
		this.spiegelGewicht=spiegelGewicht;
		this.spiegelFrontabstand=spiegelFrontabstand;
		this.schachtelHoehe=schachtelHoehe;
		this.schachtelInnenHoehe=schachtelHoehe-2*materialDicke;		
		this.gegenGewichtErniedrigung=elvBoxHoeheHalf+freiRaum;
		this.materialDicke=materialDicke;
		this.sollFreiraum=freiRaum;
		this.elvBoxHoeheHalf=elvBoxHoeheHalf;
		this.distAchse2Rand=distAchse2Rand;
		
		gewichtRueckversetzung=rueckVersFaktor*spiegelFrontabstand;
		
		initGegenBox();
		
		
		
	}
	
	private void initGegenBox() {
		
		gewicht=gegenGewicht(
				spiegelGewicht,
				spiegelFrontabstand,
				gewichtRueckversetzung
			);
		
		
		
				
		spiegelErhoehung=spiegelErhoehung (
				spiegelGewicht,
				spiegelFrontabstand,
				gegenGewichtErniedrigung,
				gewichtRueckversetzung
             );
		
		schachtelInnenBreite=10*java.lang.Math.sqrt(gewicht/(spezifischesGewicht*schachtelInnenHoehe/10));
		schachtelBreite=schachtelInnenBreite+2*materialDicke;
		schachtelInnenLaenge=schachtelInnenBreite;
		schachtelLaenge=schachtelInnenLaenge+2*materialDicke;
		
		tatsFreiraum=gegenGewichtErniedrigung-elvBoxHoeheHalf-schachtelLaenge/2;
		
		schachtelExtension=gewichtRueckversetzung-schachtelLaenge/2+extraUeberlappung;
		
		querBrettBreite=distAchse2Rand+extraUeberlappung;
		querBrettLaenge=gegenGewichtErniedrigung+schachtelBreite/2+elvBoxHoeheHalf;
		
		
		
	}
	
	/**gegenGewicht und spiegelErhoehung wird mit Schwerpunkt
	*Summenformel ermittel. Das bedeutet, dass die Summe
	*der gewichteten Schwerpunktvektoren sich im Drehpunkt
	*(Punkt Null) treffen müssen	**/
	public static double gegenGewicht(
							double spiegelGewicht,
							double spiegelAbstand,
							double gegenGewichtRueckversetzung
						) {
		
		return spiegelGewicht*spiegelAbstand/gegenGewichtRueckversetzung;
		
	}
	
	public static double spiegelErhoehung (
							double spiegelGewicht,
							double spiegelAbstand,
							double gegenGewichtErniedrigung,
							double gegenGewichtRueckVersetzung
			             ) {		
		 double gegenGewicht=gegenGewicht(spiegelGewicht,
										 spiegelAbstand,
										 gegenGewichtRueckVersetzung);
		
		return gegenGewicht*gegenGewichtRueckVersetzung/spiegelGewicht;		
	}
	

}
